// 用户信息相关数据Vuex模块
import { getUserInfo, login, getUserDetailById } from '@/api/user'
import { getToken, setToken, removeToken, setTimestamp } from '@/utils/auth'

import { resetRouter } from '@/router/index' // 权限管理 添加路由里面的重置路由给登出使用
const state = {
  token: getToken(), // 从本地获取Token
  userInfo: {} // 定义一个空的对象 不是null 因为后边要开发userInfo的属性给别人用  userInfo.name
}
const mutations = {
  // 保存token到vuex和本地 登录过程8.2
  setToken(state, token) {
    state.token = token // 更新保存token到Vuex
    setToken(token) // 更新保存token到本地  --->寻找全局的setToken()方法
  },
  removeToken(state) { // 清除token数据
    state.token = null
    removeToken()
  },
  // 删除用户信息
  removeUserInfo(state) {
    state.userInfo = {}
  },
  // 保存用户信息到vuex 12
  setUserInfo(state, userInfo) {
    state.userInfo = userInfo
  }
}
const actions = {
/** *
* vuex中actions发登录请求：context表示当前的store的实例  data接收登录表单提交过来的数据 返回token 登录过程4
* **/
  async login(context, data) {
    const token = await login(data) // 先进入请求拦截器，响应拦截器，再返回数据token
    // console.log(token)
    // 保存Token 登录过程8.1
    context.commit('setToken', token) // 调用同步方法保存token
    // 2客户端设置token是否超时 保存获取token的时间戳
    setTimestamp()
  },

  /** *
* vuex中actions获取用户基本资料action 11
* **/
  async getUserInfo(context) {
    const result = await getUserInfo() // 获取返回值result就是用户的基本资料（里面没头像）
    const baseInfo = await getUserDetailById(result.userId) // 为了获取用户头像
    const baseResult = { ...result, ...baseInfo }
    context.commit('setUserInfo', baseResult)
    // 将整个的个人信息设置到用户的vuex数据中
    // 加一个点睛之笔  这里这一步，暂时用不到，但是请注意，这给我们后边会留下伏笔
    // 简易权限管理-->加一个点睛之笔 return result 返回权限标识
    return result
  },

  /** *
  * vuex中actions退出登录的
  * **/
  logout(context) {
    // 删除token
    context.commit('removeToken') // 不仅仅删除了vuex中的 还删除了缓存中的token
    // 删除用户资料
    context.commit('removeUserInfo') // 删除用户信息
    // 权限管理，重置路由
    resetRouter()
    // 还有一步  vuex中的数据是不是还在
    // 要清空permission模块下的state数据
    // vuex中 user子模块  permission子模块
    // 子模块调用子模块的action  默认情况下 子模块的context是子模块的
    context.commit('permission/setRoutes', [], { root: true })
    // 子模块调用子模块的action 可以 将 commit的第三个参数 设置成  { root: true } 就表示当前的context不是子模块了 而是父模块
  }
}
export default {
  namespaced: true,
  state,
  mutations,
  actions
}
